package com.eian.boot.crypto.core;

import com.eian.boot.crypto.enums.CryptoAlgorithm;
import com.eian.boot.crypto.model.CryptoContext;
import com.eian.boot.crypto.model.CryptoResult;
import com.eian.boot.crypto.model.KeyPairInfo;

/**
 * 加密服务统一门面
 * <p>
 * 提供统一的加密/解密入口，根据算法自动选择对应的策略实现
 *
 * @author eian
 */
public interface CryptoService {

    /**
     * 加密
     *
     * @param plaintext 明文
     * @param algorithm 加密算法
     * @param context   加密上下文
     * @return 加密结果
     */
    CryptoResult encrypt(String plaintext, CryptoAlgorithm algorithm, CryptoContext context);

    /**
     * 解密
     *
     * @param ciphertext 密文
     * @param algorithm  加密算法
     * @param context    解密上下文
     * @return 解密结果
     */
    CryptoResult decrypt(String ciphertext, CryptoAlgorithm algorithm, CryptoContext context);

    /**
     * 生成对称密钥
     *
     * @param algorithm 算法
     * @param keySize   密钥长度（位）
     * @return Base64编码的密钥
     */
    String generateSymmetricKey(CryptoAlgorithm algorithm, int keySize);

    /**
     * 生成非对称密钥对
     *
     * @param algorithm 算法
     * @param keySize   密钥长度（位）
     * @return 密钥对信息
     */
    KeyPairInfo generateKeyPair(CryptoAlgorithm algorithm, int keySize);

    /**
     * 注册加密策略
     *
     * @param strategy 加密策略
     */
    void registerEncryptStrategy(EncryptStrategy strategy);

    /**
     * 注册解密策略
     *
     * @param strategy 解密策略
     */
    void registerDecryptStrategy(DecryptStrategy strategy);

    /**
     * 设置密钥存储实现
     *
     * @param keyStore 密钥存储实现
     */
    void setKeyStore(com.eian.boot.crypto.store.KeyStore keyStore);

    /**
     * 根据密钥ID解密（自动从存储中获取密钥）
     *
     * @param ciphertext 密文
     * @param algorithm  加密算法
     * @param keyId      密钥标识符
     * @return 解密结果
     */
    CryptoResult decryptWithStoredKey(String ciphertext, CryptoAlgorithm algorithm, String keyId);
}

